#ifndef THREAD_POOL_H
#define THREAD_POOL_H
/**********头文件**********/ 
#include <pthread.h>
#include <stdbool.h>
#include <stdint.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/**********宏定义**********/ 
#define MAX_ACTIVE_THREADS  100
#define MAX_TASK_NUMBER     100

/**********结构体声明**********/ 
//任务列表
typedef struct task                     
{
	void *(*task)(void *arg);
	void *arg;

	struct task *next;
}thread_pool_task_struct;

//线程
typedef struct thread_pool_thread                    
{
    pthread_t tid;            	// 线程ID数组 - 存储工作线程ID
	unsigned int number;
	bool thread_status;				//线程状态（1——忙碌 0——休闲）

}thread_pool_thread_struct;

//线程池对象
typedef struct thread_pool  
{
    pthread_mutex_t lock;       		//互斥锁，保证同一时间只有一个线程访问对应的线程池
    pthread_cond_t  cond;      			//条件变量

    thread_pool_task_struct* task_list;	//任务链表头指针
    pthread_t* tid_array;            	// 线程ID数组 - 存储工作线程ID
	bool* thread_status;				//线程状态（1——忙碌 0——休闲）
	thread_pool_thread_struct* thread;


	unsigned int waiting_tasks;     	// 等待执行的任务数量
	unsigned int active_threads;    	// 活动线程数量

	bool shutdown;              		// 关闭标志 - 指示线程池是否正在关闭
    
}thread_pool_struct;
//线程池单位
typedef struct thread_pool_unit                    
{
	thread_pool_struct pool;
	unsigned int idx;
}thread_pool_unit_struct;

/**********函数声明**********/ 
void thread_exit_handler(void *arg);
void *thread_routine(void *arg);
bool thread_pool_init(thread_pool_unit_struct* pool, unsigned int  threads_number);
bool thread_pool_add_task(thread_pool_struct* pool,void *(*task)(void *arg),void* arg);
bool thread_pool_add_thread(thread_pool_struct* pool,unsigned int thread_num);

#endif